import axios, {
  AxiosError,
} from 'axios'
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from './request.d'
import { Notify } from 'vant';
import { debounce } from '@/utils'
import router from '@/router'


// 创建axios实例
const axiosInstance: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, // api 的 base_url
  timeout: 50000 // 请求超时时间
})

// token 过期
const tokenLoseHandler = debounce(function () {
  localStorage.removeItem('需要删除的key')
  router.push('/login')
  Notify('当前页面已失效，请重新登录')
}, 3000, true)



// request 拦截器
axiosInstance.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    if (!config.headers) {
      throw new Error(`Expected 'config' and 'config.headers' not to be undefined`)
    }
    const token = localStorage.getItem('token')
    // const { token } = useStore().user
    // 让每个请求携带自定义token 请根据实际情况自行修改
    if (!config.headers['Authorization'] && token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  (error: any) => {
    return Promise.reject({ from: 'request_error', response: error })
  }
)

// let testTimeOut = null
// response 拦截器
axiosInstance.interceptors.response.use(
  async (response: AxiosResponse) => {
    const { olConfig = {} } = response.config
    let { code, msg, data } = response.data || {}
    if (code === 200) {
      /**配置有 responseAll 将会返回 接口整体数据 默认返回 接口返回 对象.data*/
      return olConfig.responseAll ? response.data : data
    } else {
      if (code === 401) {
        tokenLoseHandler()
      } else {
        Notify({
          type: 'warning',
          message: msg || '系统出错',
        })
      }
      return Promise.reject({ from: 'response_success:code!=200', response })
    }
  },
  (error: AxiosError) => {
    const response: AxiosResponse = error.response || {}
    const { data } = response || {}
    if (!error.response || !data) {
      let msg = '未知错误,请联系管理员'
      // 请求超时状态
      if (error.message.includes('timeout')) {
        msg = '请求超时,请检查网络是否连接正常'
      }
      Notify({
        type: 'danger',
        message: msg,
      })
      return Promise.reject({ from: 'response_error:no_res||no_res.data', response })
    }
    const { code, msg } = data
    if (code === 401) {
      tokenLoseHandler()/* token过期 */
    } else {
      const _statusText: any = {
        400: '业务相关错误代码',
        401: '授权token已过期,请重新登录',
      }
      Notify({
        type: 'warning',
        message: (msg || data.message) || _statusText[code] || '系统出错!',
      })
      return Promise.reject({ from: 'response_error:code!=200', response })
    }
  }
)

// 导出 axios 实例
export default axiosInstance
// 用于 数据 取消上次请求绑定 使用
export const CancelToken = axios.CancelToken
